/******************************************************************************
*
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*
*
******************************************************************************/

#include "odm_precomp.h"

#if (RTL8723A_SUPPORT == 1)
static bool
CheckCondition(
    const u32  Condition,
    const u32  Hex
    )
{
    u32 _board     = (Hex & 0x000000FF);
    u32 _interface = (Hex & 0x0000FF00) >> 8;
    u32 _platform  = (Hex & 0x00FF0000) >> 16;
    u32 cond = Condition;

    if ( Condition == 0xCDCDCDCD )
        return TRUE;

    cond = Condition & 0x000000FF;
    if ( (_board == cond) && cond != 0x00)
        return FALSE;

    cond = Condition & 0x0000FF00;
    cond = cond >> 8;
    if ( (_interface & cond) == 0 && cond != 0x07)
        return FALSE;

    cond = Condition & 0x00FF0000;
    cond = cond >> 16;
    if ( (_platform & cond) == 0 && cond != 0x0F)
        return FALSE;
    return TRUE;
}


/******************************************************************************
*                           RadioA_1T.TXT
******************************************************************************/

u32 Array_RadioA_1T_8723A[] = {
		0x000, 0x00030159,
		0x001, 0x00031284,
		0x002, 0x00098000,
	0xFF0F011F, 0xABCD,
		0x003, 0x00018C63,
	0xCDCDCDCD, 0xCDCD,
		0x003, 0x00039C63,
	0xFF0F011F, 0xDEAD,
		0x004, 0x000210E7,
		0x009, 0x0002044F,
		0x00A, 0x0001A3F1,
		0x00B, 0x00014787,
		0x00C, 0x000896FE,
		0x00D, 0x0000E02C,
		0x00E, 0x00039CE7,
		0x00F, 0x00000451,
		0x019, 0x00000000,
		0x01A, 0x00030355,
		0x01B, 0x00060A00,
		0x01C, 0x000FC378,
		0x01D, 0x000A1250,
		0x01E, 0x0000024F,
		0x01F, 0x00000000,
		0x020, 0x0000B614,
		0x021, 0x0006C000,
		0x022, 0x00000000,
		0x023, 0x00001558,
		0x024, 0x00000060,
		0x025, 0x00000483,
		0x026, 0x0004F000,
		0x027, 0x000EC7D9,
		0x028, 0x00057730,
		0x029, 0x00004783,
		0x02A, 0x00000001,
		0x02B, 0x00021334,
		0x02A, 0x00000000,
		0x02B, 0x00000054,
		0x02A, 0x00000001,
		0x02B, 0x00000808,
		0x02B, 0x00053333,
		0x02C, 0x0000000C,
		0x02A, 0x00000002,
		0x02B, 0x00000808,
		0x02B, 0x0005B333,
		0x02C, 0x0000000D,
		0x02A, 0x00000003,
		0x02B, 0x00000808,
		0x02B, 0x00063333,
		0x02C, 0x0000000D,
		0x02A, 0x00000004,
		0x02B, 0x00000808,
		0x02B, 0x0006B333,
		0x02C, 0x0000000D,
		0x02A, 0x00000005,
		0x02B, 0x00000808,
		0x02B, 0x00073333,
		0x02C, 0x0000000D,
		0x02A, 0x00000006,
		0x02B, 0x00000709,
		0x02B, 0x0005B333,
		0x02C, 0x0000000D,
		0x02A, 0x00000007,
		0x02B, 0x00000709,
		0x02B, 0x00063333,
		0x02C, 0x0000000D,
		0x02A, 0x00000008,
		0x02B, 0x0000060A,
		0x02B, 0x0004B333,
		0x02C, 0x0000000D,
		0x02A, 0x00000009,
		0x02B, 0x0000060A,
		0x02B, 0x00053333,
		0x02C, 0x0000000D,
		0x02A, 0x0000000A,
		0x02B, 0x0000060A,
		0x02B, 0x0005B333,
		0x02C, 0x0000000D,
		0x02A, 0x0000000B,
		0x02B, 0x0000060A,
		0x02B, 0x00063333,
		0x02C, 0x0000000D,
		0x02A, 0x0000000C,
		0x02B, 0x0000060A,
		0x02B, 0x0006B333,
		0x02C, 0x0000000D,
		0x02A, 0x0000000D,
		0x02B, 0x0000060A,
		0x02B, 0x00073333,
		0x02C, 0x0000000D,
		0x02A, 0x0000000E,
		0x02B, 0x0000050B,
		0x02B, 0x00066666,
		0x02C, 0x0000001A,
		0x02A, 0x000E0000,
		0x010, 0x0004000F,
		0x011, 0x000E31FC,
		0x010, 0x0006000F,
		0x011, 0x000FF9F8,
		0x010, 0x0002000F,
		0x011, 0x000203F9,
		0x010, 0x0003000F,
		0x011, 0x000FF500,
		0x010, 0x00000000,
		0x011, 0x00000000,
		0x010, 0x0008000F,
		0x011, 0x0003F100,
		0x010, 0x0009000F,
		0x011, 0x00023100,
		0x012, 0x00032000,
		0x012, 0x00071000,
		0x012, 0x000B0000,
		0x012, 0x000FC000,
		0x013, 0x000287B3,
		0x013, 0x000244B7,
		0x013, 0x000204AB,
		0x013, 0x0001C49F,
		0x013, 0x00018493,
		0x013, 0x0001429B,
		0x013, 0x00010299,
		0x013, 0x0000C29C,
		0x013, 0x000081A0,
		0x013, 0x000040AC,
		0x013, 0x00000020,
		0x014, 0x0001944C,
		0x014, 0x00059444,
		0x014, 0x0009944C,
		0x014, 0x000D9444,
	0xFF0F011F, 0xABCD,
		0x015, 0x0000F424,
		0x015, 0x0004F424,
		0x015, 0x0008F424,
		0x015, 0x000CF424,
	0xCDCDCDCD, 0xCDCD,
		0x015, 0x0000F474,
		0x015, 0x0004F477,
		0x015, 0x0008F455,
		0x015, 0x000CF455,
	0xFF0F011F, 0xDEAD,
		0x016, 0x00000339,
		0x016, 0x00040339,
		0x016, 0x00080339,
	0xFF0F011F, 0xABCD,
		0x016, 0x000C0356,
	0xCDCDCDCD, 0xCDCD,
		0x016, 0x000C0366,
	0xFF0F011F, 0xDEAD,
		0x000, 0x00010159,
		0x018, 0x0000F401,
		0x0FE, 0x00000000,
		0x0FE, 0x00000000,
		0x01F, 0x00000003,
		0x0FE, 0x00000000,
		0x0FE, 0x00000000,
		0x01E, 0x00000247,
		0x01F, 0x00000000,
		0x000, 0x00030159,

};

void
ODM_ReadAndConfig_RadioA_1T_8723A(
	PDM_ODM_T  pDM_Odm
	)
{
	#define READ_NEXT_PAIR(v1, v2, i) do { i += 2; v1 = Array[i]; v2 = Array[i+1]; } while(0)

	u32     hex         = 0;
	u32     i           = 0;
	u16     count       = 0;
	u32 *    ptr_array   = NULL;
	u8     platform    = pDM_Odm->SupportPlatform;
	u8     interfaceValue   = pDM_Odm->SupportInterface;
	u8     board       = pDM_Odm->BoardType;
	u32     ArrayLen    = sizeof(Array_RadioA_1T_8723A)/sizeof(u32);
	u32 *    Array       = Array_RadioA_1T_8723A;


	hex += board;
	hex += interfaceValue << 8;
	hex += platform << 16;
	hex += 0xFF000000;

	for (i = 0; i < ArrayLen; i += 2 )
	{
	    u32 v1 = Array[i];
	    u32 v2 = Array[i+1];

	    // This (offset, data) pair meets the condition.
	    if ( v1 < 0xCDCDCDCD )
	    {
		    odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2);
		    continue;
		}
		else
		{ // This line is the start line of branch.
		    if ( !CheckCondition(Array[i], hex) )
		    { // Discard the following (offset, data) pairs.
		        READ_NEXT_PAIR(v1, v2, i);
		        while (v2 != 0xDEAD &&
		               v2 != 0xCDEF &&
		               v2 != 0xCDCD && i < ArrayLen -2)
		        {
		            READ_NEXT_PAIR(v1, v2, i);
		        }
		        i -= 2; // prevent from for-loop += 2
		    }
		    else // Configure matched pairs and skip to end of if-else.
		    {
		        READ_NEXT_PAIR(v1, v2, i);
		        while (v2 != 0xDEAD &&
		               v2 != 0xCDEF &&
		               v2 != 0xCDCD && i < ArrayLen -2)
		        {
				odm_ConfigRF_RadioA_8723A(pDM_Odm, v1, v2);
				READ_NEXT_PAIR(v1, v2, i);
		        }

		        while (v2 != 0xDEAD && i < ArrayLen -2)
		        {
		            READ_NEXT_PAIR(v1, v2, i);
		        }

		    }
		}
	}

}


#endif // end of HWIMG_SUPPORT
